/*
 * tvectorporo.cpp
 *
 *  Created on: 18/11/2009
 *      Author: javier
 */

#include <iostream>
#include "tporo.h"
#include "tvectorporo.h"

using namespace std;


TVectorPoro::TVectorPoro()
{
	dimension = 0;

	datos = NULL;


}

TVectorPoro::TVectorPoro( const int dim )
{
	if ( dim < 0)
	{
		dimension = 0;

		datos = NULL;
	}
	else
	{
		dimension = dim;

		datos = new TPoro[dim];
	}
}

TVectorPoro::TVectorPoro( const TVectorPoro & v )
{


	if( v.dimension == 0 )
	{
		dimension = 0;
		datos = NULL;
	}
	else
	{
		dimension = v.dimension;
		datos = new TPoro[ dimension ];

		for( int i = 0; i < dimension; i++)
		{
			datos[i] = v.datos[i];
		}
	}
}

TVectorPoro::~TVectorPoro()
{
	delete [] datos;
	datos = NULL;
	dimension = 0;
}

TVectorPoro&
TVectorPoro::operator =( const TVectorPoro &v)
{
	if( this != &v)
	{

		if( v.dimension != 0 )
		{
			dimension = v.dimension;

			datos = new TPoro[dimension];

			for( int i = 0; i < dimension; i++)
			{
				datos[i] = v.datos[i];
			}
		}
		else
		{
			dimension = 0;
			datos = NULL;
		}
	}
	return *this;
}


bool
TVectorPoro::operator ==( const TVectorPoro &v)
{
	bool igual = true;

	if ( dimension == v.dimension )
	{
		for( int i = 0; i < dimension; i++)
		{
			if( datos[i] != v.datos[i] )
				igual = false;
		}
	}
	else
		igual = false;

	return igual;
}
bool
TVectorPoro::operator !=( const TVectorPoro &v)
{
	bool distinto = false;

	if ( dimension == v.dimension )
	{
		for( int i = 0; i < dimension; i++)
		{
			if( datos[i] != v.datos[i] )
				distinto = true;
		}
	}
	else
		distinto = true;

	return distinto;
}

TPoro&
TVectorPoro::operator [](int pos)
{

	TPoro *dato = NULL;

	if ( pos >= 1 && pos <= dimension)
	{
		dato = &datos[pos-1];
	}
	else
	{
		dato = &error;
	}

	return *dato;
}

TPoro
TVectorPoro::operator[] ( int pos ) const
{
	if ( pos >= 1 && pos <= dimension)
	{
		return datos[pos-1];
	}
	else
	{
		return error;
	}
}

int
TVectorPoro::Longitud() const
{
	return dimension;
}

int
TVectorPoro::Cantidad() const
{
	int cont = 0;

	for( int i = 0; i < dimension; i++)
	{
		if ( !datos[i].EsVacio() )
			cont ++;
	}

	return cont;
}

bool
TVectorPoro::Redimensionar(int tam)
{
	bool redi = false;
	int i = 0;

	if ( tam > 0 )
	{
		if(tam != dimension)
		{
			TVectorPoro aux(tam);
			redi = true;

			if ( tam > dimension)
			{

				for ( ; i < dimension; i++)
				{
					aux.datos[i] = this->datos[i];
				}

			}
			else
			{
				//Vector nuevo de tamaño menor al antiguo.
				for( ; i < tam; i++)
				{
					aux.datos[i] = datos[i];
				}


			}

			 *this = aux;
		}
	}
	return redi;
}

ostream&
operator<<( ostream& os, const TVectorPoro &v )
{
	int i = 0;

	os << "[";
	if ( v.Longitud() > 0 )
	{
		os << i+1 << " "<< v.datos[i];
		i++;

		for( ; i < v.Longitud(); i++)
		{
			os << " " << i+1 << " " << v.datos[i];
		}
	}

	os << "]";

	return os;
}

